package com.xuzimian.globaldemo.spring.springrpc.rmi;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.rmi.RmiProxyFactoryBean;
import org.springframework.remoting.rmi.RmiServiceExporter;

import com.xuzimian.globaldemo.spring.springrpc.RemoteServerPublisService;
import com.xuzimian.globaldemo.spring.springrpc.RemoteServerPublisServiceImpl;

@Configuration
public class SpringRmiConfig {

	/**
	 * 由于是在同一个spring容器中测试rmi的服务接口发布和客户端调用，因此需要给该注入到发布rmi服务接口的bean一个自定义的bean名称（serverBean）
	 * @return
	 */
	@Bean("serverBean")
	public RemoteServerPublisService remoteServerPublisServiceBean() {
		return new RemoteServerPublisServiceImpl("serverBean");
	}

	/**
	 * 导出一个服务为rmi服务(服务名为：RemoteServerPublisService)，并发布为到1199端口上
	 * @param remoteServerPublisService
	 * @return
	 */
	@Bean
	public RmiServiceExporter rmiExporter(@Qualifier("serverBean")RemoteServerPublisService remoteServerPublisService) {
		RmiServiceExporter rmiExporter = new RmiServiceExporter();
		rmiExporter.setService(remoteServerPublisService);
		rmiExporter.setServiceName("RemoteServerPublisService");
		rmiExporter.setServiceInterface(RemoteServerPublisService.class);
		// 不设置默认为端口1099
		rmiExporter.setRegistryPort(1199);
		return rmiExporter;
	}

	/**
	 * 在客户端装配一个rmi服务到spring的容器中,可以通过注入方式直接使用该服务bean(id:remoteServerPublisService)
	 * 由于是在同一个spring容器中测试rmi的服务接口发布和客户端调用，因此需要给客户端生成的rmi代理接口的bean一个自定义的bean名称（clientBean）
	 * @return
	 */
	@Bean
	public RmiProxyFactoryBean clientBean() {
		RmiProxyFactoryBean rmiProxy = new RmiProxyFactoryBean();
		rmiProxy.setServiceUrl("rmi://localhost:1199/RemoteServerPublisService");
		rmiProxy.setServiceInterface(RemoteServerPublisService.class);
		return rmiProxy;
	}

}
